使用有界类型参数的java“两种方法具有相同的擦除”错误
我第一次在Java中使用泛型,我面临着一个无法克服的问题:为什么要编译:
public interface Aa{}
public interface Bb{}
public interface Cc{}
public static <GenericAB extends Aa & Bb>
void method(GenericAB myABobject1, GenericAB myABobject2){}
public static <GenericAB extends Aa & Bb, GenericCA extends Cc & Aa>
void method(GenericAB myAbobject, GenericCA myCAobject){}
但这并不是:
public interface Aa{}
public interface Bb{}
public interface Cc{}
public static <GenericAB extends Aa & Bb>
void method(GenericAB myABobject1, GenericAB myABobject2){}
public static <GenericAB extends Aa & Bb, GenericAC extends Aa & Cc>
void method(GenericAB myAbobject, GenericAC myACobject){}
我得到了这个错误:两种方法都有相同的擦除
如果这是一个愚蠢的问题,我很抱歉,但我不明白为什么有界类型参数声明中的接口顺序似乎具有重要性。 事实上,我不认为是顺序导致了错误,但我不知道是什么导致了错误
我在读this documentation by Oracle,它说我必须把类作为第一个参数,但是Aa、Bb和Cc都是接口。我的英语也很抱歉
# 1 楼答案
重要的是顺序(§4.6):
GenericBC
擦除为Aa
或Cc
,具体取决于绑定中最先出现的(即最左侧)关于一般类型擦除的解释,请参见type erasure tutorial和type erasure, when and what happens Q&A
# 2 楼答案
因为在类型擦除之后的运行时,这两个方法都具有相同的方法头
变成
及
变成
两个结果方法具有相同的签名,这将导致您的错误
修正以下参数后进行编辑